package dao;

import bean.Message;
import bean.PageBean;
import util.JdbcUtils;
import util.StringUtil;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * 骑行用户之间发送的信息
 *
 * @author 邓晴予
 */
public class MessageDao {
    /**
     * 获取消息列表
     *
     * @param pageBean the page bean
     * @param message  the message
     * @return list
     * @author 邓晴予
     */
    public List<Object> messageList(PageBean pageBean, Message message) {
        StringBuilder sb = new StringBuilder("select * from message m ");
        List<Object> para = new ArrayList<>();
        if (StringUtil.isNotEmpty(message.getMessageId())) {
            sb.append(" and m.messageId = ?");
            para.add(message.getMessageId());
        }
        if (StringUtil.isNotEmpty(message.getSendId())) {
            sb.append(" and m.sendId = ?");
            para.add(message.getSendId());
        }
        if (StringUtil.isNotEmpty(message.getReceiveId())) {
            sb.append(" and m.receiveId = ?");
            para.add(message.getReceiveId());
        }
        if (StringUtil.isNotEmpty(message.getContent())) {
            sb.append(" and m.content = ?");
            para.add(message.getContent());
        }
        if (StringUtil.isNotEmpty(message.getSendTime())) {
            sb.append(" and m.sendTime = ?");
            para.add(message.getSendTime());
        }
        if (StringUtil.isNotEmpty(message.getStatus())) {
            sb.append(" and m.status = ?");
            para.add(message.getStatus());
        }
        if (pageBean != null) {
            sb.append(" limit ").append(pageBean.getStart()).append(",").append(pageBean.getRows());
        }
        sb.append("order by sendTime desc");
        String sql = sb.toString().replaceFirst("and", "where");
        List<Object> list = JdbcUtils.queryForArrObject(sql, para, Message.class);
        return list.isEmpty() ? Collections.emptyList() : list;
    }

    /**
     * 删除消息
     *
     * @param delIds the del ids
     * @throws Exception the exception
     * @author 邓晴予
     */
    public void messageDelete(String delIds) throws Exception {
        String sql = "delete message where messageId in(?)";
        List<Object> para = new ArrayList<>();
        para.add(delIds);
        JdbcUtils.update(sql, para);
    }

    /**
     * 添加消息
     *
     * @param message the user
     * @return boolean boolean
     * @throws Exception the exception
     * @author 邓晴予
     */
    public boolean messageAdd(Message message) throws Exception {
        StringBuffer sb = new StringBuffer("insert into message values(");
        List<Object> para = new ArrayList<>();
        if (StringUtil.isNotEmpty(message.getMessageId())) {
            sb.append(" ,?");
            para.add(message.getMessageId());
        } else {
            sb.append(", null");
        }
        if (StringUtil.isNotEmpty(message.getSendId())) {
            sb.append(" ,?");
            para.add(message.getSendId());
        }
        if (StringUtil.isNotEmpty(message.getReceiveId())) {
            sb.append(" ,?");
            para.add(message.getReceiveId());
        }
        if (StringUtil.isNotEmpty(message.getContent())) {
            sb.append(" ,?");
            para.add(message.getContent());
        }
        if (StringUtil.isNotEmpty(message.getSendTime())) {
            sb.append(" ,?");
            para.add(message.getSendTime());
        } else {
            sb.append(" , now()");
        }
        if (StringUtil.isNotEmpty(message.getStatus())) {
            sb.append(" ,?");
            para.add(message.getStatus());
        } else {
            sb.append(" ,-1");
        }
        sb.append(")");
        String sql = sb.toString().replaceFirst(",", " ");
        return 1 == JdbcUtils.update(sql, para);
    }

    /**
     * 消息状态改变
     *
     * @param status    the status
     * @param messageId the message id
     * @return boolean boolean
     * @author 邓晴予
     */
    public boolean changeStatus(int status, String messageId) {
        String sql = "update message set status=? where messageId=?";
        List<Object> para = new ArrayList<>();
        para.add(status);
        para.add(messageId);
        return 1 == JdbcUtils.update(sql, para);
    }

    /**
     * User count int.
     *
     * @param message the message
     * @return the int
     * @throws Exception the exception
     * @author 邓晴予
     */
    public int messageCount(Message message) throws Exception {
        StringBuilder sb = new StringBuilder("select count(*) as total from message m");

        List<Object> para = new ArrayList<>();
        if (StringUtil.isNotEmpty(message.getMessageId())) {
            sb.append(" and m.messageId =? ");
            para.add(message.getMessageId());
        }
        if (StringUtil.isNotEmpty(message.getSendId())) {
            sb.append(" and m.sendId =? ");
            para.add(message.getSendId());
        }
        if (StringUtil.isNotEmpty(message.getReceiveId())) {
            sb.append(" and m.receiveId =? ");
            para.add(message.getReceiveId());
        }
        if (StringUtil.isNotEmpty(message.getContent())) {
            sb.append(" and m.content =? ");
            para.add(message.getContent());
        }
        if (StringUtil.isNotEmpty(message.getSendTime())) {
            sb.append(" and m.sendTime =? ");
            para.add(message.getSendTime());
        }
        if (StringUtil.isNotEmpty(message.getStatus())) {
            sb.append(" and m.status =? ");
            para.add(message.getStatus());
        }

        String sql = sb.toString().replaceFirst("and", "where");
        List<Map<String, String>> result = JdbcUtils.queryForMap(sql, para);
        return result.isEmpty() ? 0 : Integer.parseInt(result.get(0).get("total"));
    }

    /**
     * 获取骑行用户未读消息的个数
     *
     * @param userId the user id
     * @return int
     * @author 邓晴予
     */
    public int unreadMessage(String userId) {
        String sql = "select count(*) as total from message where receiveId=? and status=-1";

        List<Object> para = new ArrayList<>();
        if (StringUtil.isNotEmpty(userId)) {
            para.add(userId);
        }
        List<Map<String, String>> result = JdbcUtils.queryForMap(sql, para);

        return result.size();
    }
}
